﻿using System;
using Onshi.POS.Articulos.Vistas;
using Onshi.POS.Modelo.Entidades;
using Onshi.POS.Modelo.Enumeradores;
using Onshi.POS.Modelo.Objetos;
using Onshi.POS.Repositorios;
using System.Collections.Generic;
using System.Linq;

namespace Onshi.POS.Articulos
{
    public class ArticulosAltaModificacionUnidadPresentador
    {
        #region Constructores

        public ArticulosAltaModificacionUnidadPresentador(IArticulosAltaModificacionUnidad vista)
        {
            this.vista = vista;
            listaAtributosDetalles = new List<ArticuloAtributoDetalle>();
        }

        #endregion

        #region Atributos

        private IArticulosAltaModificacionUnidad vista;
        private List<ArticuloAtributoDetalle> listaAtributosDetalles;

        #endregion

        #region Propiedades

        private RepositorioTipoArticulo RepositorioTipoArticulo
        {
            get { return new RepositorioTipoArticulo(); }
        }

        private RepositorioRubroArticulo RepositorioRubroArticulo
        {
            get { return new RepositorioRubroArticulo(); }
        }

        private RepositorioDescuentoRecargo RepositorioDescuentoRecargo
        {
            get { return new RepositorioDescuentoRecargo(); }
        }

        private RepositorioMarca RepositorioMarca
        {
            get { return new RepositorioMarca(); }
        }

        private RepositorioRubroVendedor RepositorioRubroVendedor
        {
            get { return new RepositorioRubroVendedor(); }
        }

        private RepositorioVendedor RepositorioVendedor
        {
            get { return new RepositorioVendedor(); }
        }

        private RepositorioTipoComisionArticulo RepositorioTipoComisionArticulo
        {
            get { return new RepositorioTipoComisionArticulo(); }
        }

        private RepositorioTipoImpuestoArticulo RepositorioTipoImpuestoArticulo
        {
            get { return new RepositorioTipoImpuestoArticulo(); }
        }

        private RepositorioTipoCostoArticulo RepositorioTipoCostoArticulo
        {
            get { return new RepositorioTipoCostoArticulo(); }
        }

        private RepositorioPromocion RepositorioPromocion
        {
            get { return new RepositorioPromocion(); }
        }

        private RepositorioArticulo RepositorioArticulo
        {
            get { return new RepositorioArticulo(); }
        }

        private RepositorioRegistro RepositorioRegistro
        {
            get { return new RepositorioRegistro(); }
        }

        public RepositorioTipoRegistro RepositorioTipoRegistro
        {
            get { return new RepositorioTipoRegistro(); }
        }

        public RepositorioArticuloAtributo RepositorioArticuloAtributo
        {
            get { return new RepositorioArticuloAtributo(); }
        }

        public RepositorioArticuloAtributoDetalle RepositorioArticuloAtributoDetalle
        {
            get { return new RepositorioArticuloAtributoDetalle(); }
        }

        public RepositorioArticuloAtributoDetalleUbicacion RepositorioArticuloAtributoDetalleUbicacion
        {
            get { return new RepositorioArticuloAtributoDetalleUbicacion(); }
        }

        public RepositorioUbicacion RepositorioUbicacion
        {
            get { return new RepositorioUbicacion(); }
        }

        #endregion

        #region Metodo

        public void Inicializar()
        {

            vista.Ubicaciones = RepositorioUbicacion.DevolverTodos();
            switch (vista.EstadoABM)
            {
                case EnumEstadoAltaBajaModificacionHabilitacion.MODIFICACION:
                    var articulo = RepositorioArticulo.DevolverPorIdConDetalle(vista.IdArticulo);
                    vista.IdArticulo = articulo.Id;
                    vista.IdRubroArticulo = articulo.Rubro.Id;
                    vista.IdDescuentoRecargo = articulo.DescuentoRecargo.Id;
                    vista.IdMarca = articulo.Marca.Id;
                    vista.IdTipoComisionArticulo = articulo.TipoComision.Id;
                    vista.IdTipoImpuestoArticulo = articulo.TipoImpuesto.Id;
                    vista.IdTipoCostoArticulo = articulo.TipoCosto.Id;
 
                    if (articulo.Promocion != null)
                        vista.IdPromocion = articulo.Promocion.Id;

                    vista.Codigo = articulo.Codigo;
                    vista.Nombre = articulo.Nombre;
                    vista.ExistenciaMinima = articulo.ExistenciaMinima;
                    vista.ExistenciaMaxima = articulo.ExistenciaMaxima;
                    vista.Costo = articulo.Costo;
                    vista.Comision = articulo.Comision;
                    vista.ComisionMaxima = articulo.ComisionMaxima;
                    vista.Iva = articulo.Iva;
                    vista.Impuesto = articulo.Impuesto;
                    vista.EstaEliminado = articulo.EstaEliminado;
                    if (articulo.Detalle != null)
                    {
                        vista.Imagen = articulo.Detalle.Imagen;
                        vista.Observacion = articulo.Detalle.Observacion;
                    }
                    break;
            }
        }

        public void Aceptar()
        {
            switch (vista.EstadoABM)
            {
                case EnumEstadoAltaBajaModificacionHabilitacion.ALTA:
                    if (!DatosComunes.TienePermiso(EnumPermiso.ARTICULO_ALTA))
                        throw new Exception(DatosComunes.SinPermiso);
                    break;
                case EnumEstadoAltaBajaModificacionHabilitacion.MODIFICACION:
                    if (!DatosComunes.TienePermiso(EnumPermiso.ARTICULO_MODIFICACION))
                        throw new Exception(DatosComunes.SinPermiso);
                    break;
            }

            var articulo = new Articulo();
            articulo.Codigo = vista.Codigo;
            if (articulo.Codigo.Trim() == String.Empty)
                throw new Exception("El código no puede quedar vacio");
            articulo.Nombre = vista.Nombre;
            if (articulo.Nombre.Trim() == String.Empty)
                throw new Exception("El nombre no puede quedar vacio");

            if (articulo.TipoComision != null)
            {
                switch ((EnumTipoComisionArticulo)articulo.TipoComision.Id)
                {
                    case EnumTipoComisionArticulo.SIN_COMISION:
                        articulo.Comision = 0;
                        articulo.ComisionMaxima = 0;
                        break;
                }
            }

            articulo.Rubro = RepositorioRubroArticulo.DevolverPorId(vista.IdRubroArticulo);
            articulo.TipoComision = RepositorioTipoComisionArticulo.DevolverPorId(vista.IdTipoComisionArticulo);
            articulo.TipoImpuesto = RepositorioTipoImpuestoArticulo.DevolverPorId(vista.IdTipoImpuestoArticulo);
            articulo.TipoCosto = RepositorioTipoCostoArticulo.DevolverPorId(vista.IdTipoCostoArticulo);

            articulo.DescuentoRecargo = RepositorioDescuentoRecargo.DevolverPorId(vista.IdDescuentoRecargo);
            articulo.Marca = RepositorioMarca.DevolverPorId(vista.IdMarca);
            articulo.Promocion = RepositorioPromocion.DevolverPorId(vista.IdPromocion);
            articulo.Tipo = RepositorioTipoArticulo.DevolverPorId((Byte)EnumTipoArticulo.UNIDAD);

            articulo.ExistenciaMinima = vista.ExistenciaMinima;
            articulo.ExistenciaMaxima = vista.ExistenciaMaxima;
            articulo.DescripcionServicio = String.Empty;
            articulo.Costo = vista.Costo;
            articulo.Comision = vista.Comision;
            articulo.ComisionMaxima = vista.ComisionMaxima;
            articulo.Iva = vista.Iva;
            articulo.Impuesto = vista.Impuesto;
            articulo.EstaEliminado = vista.EstaEliminado;
            
            articulo.Detalle = new DetalleArticulo();
            articulo.Detalle.Articulo = articulo;
            articulo.Detalle.Observacion = vista.Observacion;
            articulo.Detalle.Imagen = vista.Imagen;

            
            var registro = new Registro();
            registro.Usuario = DatosComunes.Usuario;
            switch (vista.EstadoABM)
            {
                case EnumEstadoAltaBajaModificacionHabilitacion.ALTA:
                    registro.Tipo = RepositorioTipoRegistro.DevolverPorId((Byte)EnumTipoRegistro.ARTICULO_ALTA);
                    break;
                case EnumEstadoAltaBajaModificacionHabilitacion.MODIFICACION:
                    registro.Tipo = RepositorioTipoRegistro.DevolverPorId((Byte)EnumTipoRegistro.ARTICULO_MODIFICACION);
                    break;
            }

            if (registro.Tipo == null)
                throw new Exception("El tipo de registro no existe");

            switch (vista.EstadoABM)
            {
                case EnumEstadoAltaBajaModificacionHabilitacion.ALTA:
                    RepositorioArticulo.Insertar(articulo);
                    RepositorioArticulo.InsertarDetalle(articulo.Detalle);
                    break;
                case EnumEstadoAltaBajaModificacionHabilitacion.MODIFICACION:
                    articulo.Id = vista.IdArticulo;
                    RepositorioArticulo.Modificar(articulo);
                    RepositorioArticulo.ModificarDetalle(articulo.Detalle);
                    break;
            }
            RepositorioRegistro.Insertar(registro, articulo);


            if (vista.AtributosDetalles != null)
            {
                foreach (var atributoDetalle in vista.AtributosDetalles)
                {
                    atributoDetalle.Articulo = articulo;
                    RepositorioArticuloAtributoDetalle.Insertar(atributoDetalle);
                }
            }

            if (vista.AtributosDetallesUbicaciones != null)
            {
                foreach (var atributoDetalleUbicacion in vista.AtributosDetallesUbicaciones)
                {
                    atributoDetalleUbicacion.AtributoDetalle = (from item in vista.AtributosDetalles 
                                                               where item.DescripcionAtributo == atributoDetalleUbicacion.AtributoDetalleDescripcion &&
                                            item.Valor == atributoDetalleUbicacion.AtributoDetalleValor
                                          select item).ToList()[0];

                    atributoDetalleUbicacion.Articulo = articulo;
                    RepositorioArticuloAtributoDetalleUbicacion.Insertar(atributoDetalleUbicacion);
                }
            }
        }

        #endregion
    }
}
